# www.numpy.org.cn
import numpy as np
# 自制的数据集
import dataset 
# 绘图工具库
import plot_utils

# sigmoid激活函数
def sigmoid(z):
    return 1/(1+np.exp(-z))

# 1 获取100组numpy数组随机数据
m=100
# 2 xs是二维数组 矩阵
# 向量 矩阵 张量 。。。
xs,ys = dataset.get_xy_dateset7_1(m)
plot_utils.show_scatter(xs,ys)
# 第x个参数w 当前层第x个神经元 第x层隐藏层
# 第1层
# 第1个神经元 第1个w
w11_1 = 0.1
# 第1个神经元 第2个w
w21_1 = 0.1
b1_1 = 0.1

# 二维数组 第1列
x1s = xs[:,0]
# 二维数组 第2列
x2s = xs[:,1]

# 前向传播
def forward_propagation(x1s,x2s):
    z1_1 = w11_1*x1s+w21_1*x2s+b1_1
    a1_1 = sigmoid(z1_1)
    return a1_1

# 3 看下未训练的三维图
a1_1 = forward_propagation(x1s,x2s)
plot_utils.show_scatter_surface(xs,ys,forward_propagation)

# 4 炼丹
for _ in range(500):
    # 循环100次 依次取出数据处理
    for i in range(100):
        x = xs[i]
        y = ys[i]
        x1 = x[0]
        x2 = x[1]
        # 前向传播
        a1_1 = forward_propagation(x1,x2)        # 反向传播
        # 误差代价e
        e = (y-a1_1)**2
        deda1_1 = -2*(y-a1_1)
        da1_1dz1_1 = a1_1*(1-a1_1)
        dz1_1dw11_1 = x1
        dz1_1dw21_1 = x2
        dz1_1db = 1
        dedw11_1 = deda1_1 *da1_1dz1_1 *dz1_1dw11_1
        dedw21_1 = deda1_1 *da1_1dz1_1 *dz1_1dw21_1
        dedb = deda1_1 *da1_1dz1_1 * dz1_1db

        # 学习率0.03
        alpha = 0.03
        # 反向传播后的参数调整
        w11_1 = w11_1 - alpha*dedw11_1
        w21_1 = w21_1 - alpha*dedw21_1
        b1_1 = b1_1 - alpha*dedb

plot_utils.show_scatter_surface(xs,ys,forward_propagation)
